import com.akaovi.exp.utils.Utils;

import java.util.ArrayList;

/**
 * @author akaovi
 * @version 1.0
 * @description
 * @date 2022/10/24 14:00
 * @since 2022/10/24 14:00
 */
public class Exp {
    public int recursion(int n) {
        if (n == 1) {
            return 1;
        }

        return n * recursion(n - 1);
    }

    /**
     * 一个皮球从200米高度自由落下，每次落地后反跳回原高度的一半；
     * 求第n次（n 值由键盘输入）落地经过路线总长度和下次反弹的高度。
     */
    public void ball() {
        int n = Utils.getOneInt();
        int num = 200;
        int sum = 200;
        for (int i = 1; i < n; ++i) {
            num /= 2;
            sum += 2 * num;
        }

        String res = "总长度: %d, 下次反弹高度: %d\n";
        System.out.printf(res, sum, num / 2);
    }

    /**
     * 3、任何一个大于6的偶数可以拆分成两个质数的和。
     */
    public void split() {
        int n;

        while (true) {
            n = Utils.getOneInt();
            if (n > 6) {
                break;
            }
        }

        for (int i = 2; i < n / 2; ++i) {
            if (Utils.isPrime(i) && Utils.isPrime(n - i)) {
                System.out.printf("%d + %d = %d\n", i, n - i, n);
            }
        }
    }

    /**
     * 测试三个排序方法的效率
     * 为什么插入排序这么快, 检查了是深拷贝!
     */
    public void performance() {
        long start, end;
        ArrayList<int[]> arrList1 = new ArrayList<>();
        // 生成2000个测试用例
        for (int i = 0; i < 2000; ++i) {
            arrList1.add(Utils.createIntArr(2000));
        }
        ArrayList<int[]> arrList2 = Utils.clone(arrList1);
        ArrayList<int[]> arrList3 = Utils.clone(arrList1);

        start = System.currentTimeMillis();
        for (int[] testArr : arrList1) {
            testForOneArr(testArr, 0);
        }
        System.out.println("冒泡排序用时:" + (System.currentTimeMillis() - start));

        start = System.currentTimeMillis();
        for (int[] testArr : arrList2) {
            testForOneArr(testArr, 1);
        }
        System.out.println("插入排序用时:" + (System.currentTimeMillis() - start));

        start = System.currentTimeMillis();
        for (int[] testArr : arrList3) {
            testForOneArr(testArr, 2);
        }
        System.out.println("排序排序用时:" + (System.currentTimeMillis() - start));

    }

    /**
     * 对一个数组排序
     *
     * @param arr  待排序数组
     * @param flag 使用排序的种类  0、1、2 三种
     */
    private void testForOneArr(int[] arr, int flag) {
        switch (flag) {
            case 0: {
                Utils.bubbleSort(arr);
                break;
            }
            case 1: {
                Utils.insertSort(arr);
                break;
            }
            case 2: {
                Utils.selectSort(arr);
                break;
            }
            default:
                System.out.println("检查第二个参数");
        }
    }

    public static void main(String[] args) {
//        System.out.println(new Exp().recursion(10));
//        new Exp().ball();
//        new Exp().split();
        new Exp().performance();
    }

}
